home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
BBS_UTL
/
DDPLUS71
/
DDPLUS.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-05-13
|
40KB
|
1,728 lines
unit DDPlus;
{$V-,F+}
interface
uses dos, crt, comio, ddscott, ddansi2, ddovr, ddovr2;
type
CharOriginType=(localchar,remotechar);
strptr=^string;
const
version= 'Version 7.10 ; 05-01-95';
progname: string[60] = 'Another DDPlus 7.0 Door Game';
graphics_codes: array[1..5] of string[4] = ('','.ASC','.ANS','.MUS','.ANS');
{ You will have to make up your mind to have item #5 .ANS or .RIP. You may }
{ find that displaying a ripfile is more effectively done if shown some }
{ other day. }
ack=#6;
nak=#21;
sot=#1;
var
lockbaud: longint; {lock baud rate }
com1,com2,com3,com4 : byte; { temporary non-std comports }
port1,port2,port3,port4:word;
irq1,irq2,irq3,irq4 : byte;
com_port: byte; {from DROP FILE: com port }
fossilIO,DigiIO: boolean; {from .CTL file: fossil, digiboard i/o }
mintime: byte; {Minimum time left before user kicked off}
notime: string; {Out of time filename }
macro,macro_str: string; {Used in the macro routines }
node_num: byte; {Node number }
time_credit: integer; {Time credit +/- (arrow keys) }
CharOrigin: CharOrigInType; {Where character came from }
fouled_up: char; {Internal use }
localcol: boolean; {From .CTL file: Local color enabled }
ansion: boolean; {Process ANSI locally }
time_check: boolean; {Check time left - halt if < mintime }
moreok : boolean; {display <more> prompt? }
curlinenum: integer; {current line num - used by <more> }
stacked: string; {used internally - stacked commands }
F1toggle: byte; {Show Help or Status Line }
inchat : byte; {Already inchat don't do this again }
chatdone : boolean; {has there been a chat? }
current_foreground: byte; {current foreground color }
current_background: byte; {current background color }
color_chg: boolean; {send ANSI color change sequences? }
default_fore: byte; {default foreground color }
default_back: byte; {default background color }
cdropped,tdropped: boolean; {carrier dropped? timedropped }
bbs_time_left: integer; {from DROP FILE: time left }
bbs_software: byte; {from .CTL file: bbs type }
baud_rate: longint; {from DROP FILE: baud rate }
statfore,statback: byte; {status line foreground }
statline: boolean; {status line background }
graphics: byte; {from DROP FILE: graphics code }
local: boolean; {from DROP FILE: local mode }
user_number: word; {from DROP FILE: user's access level }
user_first_name: string[30]; {from DROP FILE: user's first name }
user_last_name: string[30]; {from DROP FILE: user's last name }
sysop_first_name: string[30]; {from .CTL file: sysop's first name }
sysop_last_name: string[30]; {from .CTL file: sysop's last name }
board_name: string[70]; {from .CTL file: board name }
Pause_Code : string; { Rip PAUSE CODE OF YOUR BBS }
st_hr, st_mn, st_sc,save_sc: word; {used by timer calculations }
color1: boolean; {from .CTL file: color1 mode }
EMSOK : boolean; {/ESM use esm memory }
NetOK : boolean; {A Dos only network is present }
NoLocal : boolean; { Local echo turned off (statback) }
stackon: boolean; {process stacked commands? }
badchar: string; {internal use }
maxtime: word; {from .CTL file: maximum time in door }
user_access_level: word;
numlines: byte; {from .CTL file: number of lines/screen }
oldtextmode: word; {original text mode }
GoRip : byte; { enables force RIP }
lastsetfore: byte; {last set_foreground color }
setforecheck: boolean; {check repetetive set_foreground calls? }
dropfilepath: string; {from parm list }
cc : integer; { read cycle counter }
soutput: text; {Simultanious output file }
proc_call_ptr: pointer; {used internally }
nodirect: boolean;
Procedure DV_Aware_On;
Procedure DV_Pause;
Procedure Win_Pause;
Procedure ReleaseTimeSlice;
procedure close_async_port;
procedure Open_async_port;
function skeypressed: boolean;
Procedure Clear_Region(x,a,b:byte);
procedure sendtext(s: string);
procedure sgoto_xy(x,y: integer);
procedure sclrscr;
procedure sclreol;
procedure swrite(s: string);
procedure swritec(ch: char);
procedure swriteln(s: string);
Procedure swritexy(x,y:integer;s:string);
Procedure Propeller(v:byte);
procedure sread_char(var ch: char);
procedure sread(var s: string);
procedure sread_num(var n: integer);
procedure sread_num_byte(var b: byte);
procedure sread_num_word(var n: word);
procedure sread_num_longint(var n: longint);
Procedure speedread(var ch : char);
function time_left: integer;
procedure set_foreground(f: byte);
procedure set_background(b: byte);
procedure set_color(f,b: byte);
procedure prompt(var s: string; le: integer; pc: boolean);
Procedure elapsed(time1_hour, time1_min, time1_sec, time2_hour, time2_min,
time2_sec: longint; var elap_hour, elap_min, elap_sec: word);
procedure get_stacked(var s: string);
procedure sread_char_filtered(var ch: char);
procedure display_status;
Procedure Displayfile(filen: string);
Procedure SelectAnsi(chflag :char;filenm: string);
procedure DDAssignSoutput(var f: text);
procedure InitDoorDriver(ConfigFileName: string);
function Time_used: integer;
Implementation
{$L DVAWARE.OBJ}
Procedure DV_Aware_On; External;
Procedure DV_Pause; External;
var
buffered: boolean;
exitsave: pointer;
tcolor,bcolor: integer;
firsttime: boolean;
procedure Dos_Sleep;
var
Regs : Registers;
begin
with Regs do
Intr($28,Regs);
end;
{ This releases the virtual machine time slice for MSwindows, Dos 5.0, OS/2 }
procedure Win_Pause;
var
Regs : Registers;
begin
with Regs do
begin
Ax := $1680;
Intr($2F,Regs);
end;
end;
Procedure ReleaseTimeSlice;
begin
Case Tasker of
1 : DV_Pause;
2,4,5 : Win_Pause;
3 : begin
Win_Pause;
Dos_Sleep; { OS/2 likes this/ it don't hurt }
end;
else
Dos_Sleep;
end;
end;
Procedure Clear_Region(x,a,b:byte);
var
i : byte;
begin
for i := a to b do
begin
SGoto_XY(x,i);
Sclreol;
end;
end;
Procedure Chat_Eof(flag:byte);
begin
If wherey =24 then
begin
Clear_Region(1,19,21);
SGoto_XY(1,19);
Swrite('»');
end
else
if flag=1 then
swriteln('');
If wherey=22 then
begin
Clear_Region(1,22,24);
Sgoto_XY(1,22);
end;
end;
{ This is the old continous rolling chat }
{
procedure forced_chat;
var
cx,cy:byte;
ch: char;
a: integer;
old_origin: charorigintype;
word: string;
lastspace: integer;
begin;
swriteln('');
set_foreground(lightred);
swriteln('Chat mode enabled. ESC exits.');
set_foreground(lightblue);
old_origin:=localchar;
lastspace:=0;
word:='';
repeat;
sread_char(ch);
if charorigin<>old_origin then if charorigin=localchar then set_foreground(lightblue) else set_foreground(yellow);
old_origin:=charorigin;
swrite(ch);
if ch=#8 then begin;
swrite(' '+#8);
if length(word)>0 then delete(word,1,1);
end;
if ch=#13 then begin;
swrite(#10);
lastspace:=0;
word:='';
end;
if (ch<>' ') and (ch<>#8) and (ch<>#13) then word:=word+ch;
if ch=' ' then begin;
lastspace:=wherex;
word:='';
end;
if wherex>75 then begin;
if lastspace=0 then begin;
swriteln('');
end else begin;
while wherex>lastspace do swrite(#8+' '+#8);
swriteln('');
swrite(word);
end;
end;
until ch=#27;
set_foreground(default_fore);
end;
}
{ This is the new formated chat that uses lines 19-24 for a chat }
{ window that rolls from 19-24 and back again. }
{ Remember to check for #3 when this returns so you can refresh the }
{ area this has colored black. }
procedure forced_chat;
var
i,x,y,cx,cy,oldy:byte;
ch: char;
a: integer;
old_origin: charorigintype;
word: string;
lastspace: integer;
begin;
SGoto_XY(1,19);
Set_Color(0,6);
swrite(' The SYSOP wants to chat with you. [ESC] to exit.');
Sclreol;
Set_Color(7,0);
Clear_Region(1,20,24);
SGoto_XY(1,20);
Swrite('»');
set_foreground(11);
old_origin:=localchar;
lastspace:=0;
word:='';
repeat;
sread_char(ch);
if charorigin<>old_origin then
if charorigin=localchar then
set_foreground(11)
else
set_foreground(14);
old_origin:=charorigin;
swrite(ch);
if ch=#8 then
begin
swrite(' '+#8);
if length(word)>0 then
delete(word,1,1);
end;
if ch=#13 then
begin
if wherey >23 then
Chat_Eof(0)
else
begin
swrite(#10);
if wherey =22 then
Chat_Eof(0);
swrite('»');
end;
lastspace:=0;
word:='';
end;
if (ch<>' ') and (ch<>#8) and (ch<>#13) then
word:=word+ch;
if ch=' ' then
begin
lastspace:=wherex;
word:='';
end;
if wherex>75 then
begin
if lastspace=0 then
Chat_Eof(1)
else
begin
while wherex>lastspace do swrite(#8+' '+#8);
Chat_Eof(1);
swrite(word);
end;
end;
until ch=#27;
Set_Color(7,0);
Clear_Region(1,19,24);
end;
Procedure DropMessage;
begin;
writeln;
writeln('Carrier Dropped, returning to BBS.');
cdropped:=true;
halt;
end;
procedure BlankScreenMessage;
begin
gotoxy (trunc((80-length(progname))/2),10);
write(progname);
gotoxy (26,12);
write('Local screen mode turned off.');
gotoxy (1,1);
end;
Procedure HosedMessage;
begin
Swriteln('');
Swriteln('');
Set_Color(15,0);
Swrite('The SYSOP has terminated the game and is returning you to the BBS!');
ReleaseTimeSlice;
delay(500);
ReleaseTimeSlice;
end;
procedure textcolor(i: byte);
begin;
if localcol then crt.textcolor(i);
tcolor:=i;
end;
procedure textbackground(i: byte);
begin;
if localcol then crt.textbackground(i);
bcolor:=i;
end;
procedure elapsed(time1_hour, time1_min, time1_sec, time2_hour, time2_min,
time2_sec: longint; var elap_hour, elap_min, elap_sec: word);
var
a,b,c: longint;
begin;
if time1_hour<time2_hour then time1_hour:=time1_hour+24;
a:=(time1_hour*3600)+(time1_min*60)+time1_sec;
b:=(time2_hour*3600)+(time2_min*60)+time2_sec;
c:=a-b;
if c>=3600 then elap_hour:=c div 3600 else elap_hour:=0;
c:=c-((c div 3600)*3600);
if c>=60 then elap_min:=c div 60 else elap_min:=0;
c:=c-((c div 60)*60);
elap_sec:=c;
end;
function time_left: integer;
var
hour, minute, second, sec100: word;
el_hr, el_mn, el_sc: word;
begin;
gettime(hour, minute, second, sec100);
elapsed(hour, minute, second, st_hr, st_mn, st_sc, el_hr, el_mn, el_sc);
time_left:=time_credit+(bbs_time_left-((el_hr*60)+el_mn));
end;
function time_used: integer;
var
hour, minute, second, sec100: word;
el_hr, el_mn, el_sc: word;
begin;
gettime(hour, minute, second, sec100);
elapsed(hour, minute, second, st_hr, st_mn, st_sc, el_hr, el_mn, el_sc);
time_used:=(el_hr*60)+el_mn;
end;
procedure display_Fkeys;
var
a,b: integer;
x,y: integer;
begin;
save_sc:=999;
x:=wherex;
y:=wherey;
cursoroff;
window(1,1,80,numlines);
a:=tcolor;
b:=bcolor;
textcolor(statfore);
textbackground(statback);
gotoxy(1,numlines);
clreol;
write(' F1=Help Toggle │ F2=Chat │ F7=+5Min │ F8=-5Min │ F10=Eject │');
window(1,1,80,numlines-1);
gotoxy(x,y);
textcolor(a);
textbackground(b);
If Not NoLocal then cursoron;
if f1toggle=0 then
f1toggle:=1
else
begin
firsttime:=true;
f1toggle:=0
end;
end;
procedure display_status;
var
a,b: integer;
c,d: word;
x,y: integer;
hour, minute, second, sec100, el_mn, el_hr, el_sc: word;
begin;
x:=wherex;
y:=wherey;
cursoroff;
window(1,1,80,numlines);
a:=tcolor;
b:=bcolor;
textcolor(statfore);
textbackground(statback);
if firsttime then
begin
gotoxy(1,numlines);
clreol;
write(user_first_name+' '+user_last_name);
gotoxy(40-(length(progname+' - Node '+va(node_num)) div 2),numlines);
write(progname+' - Node '+va(node_num));
firsttime:=false;
save_sc:=999;
end;
gettime(hour,minute,second,sec100);
elapsed(hour,minute,second,st_hr,st_mn,st_sc,el_hr,el_mn,el_sc);
c:=(bbs_time_left-1)+time_credit;
if (time_left<mintime) and (time_check) then
begin
cursoron;
if notime<>'' then swriteln('(*** Time limit exceeded ***)');
swriteln('');
tdropped:=true;
halt;
end;
c:=c-((el_hr*60)+el_mn);
d:=60-el_sc;
if d<>save_sc then
begin
gotoxy(74,numlines);
clreol;
gotoxy(74,numlines);
write(c,':');
if d<10 then write('0');
write(d);
save_sc:=d;
end;
textcolor(a);
textbackground(b);
window(1,1,80,numlines-1);
gotoxy(x,y);
If Not NoLocal then cursoron;
end;
procedure Selectansi;
var
f: text;
b,g,counter,chcount : integer;
c,quit: boolean;
k,ch: char;
ansisave,moresave,swon : boolean;
ofm: word;
begin
ofm:=filemode;
filemode:=66;
ansisave:=ansion;
ansion:=true;
quit:=false;
counter:=1;
chcount:=0;
c:=false;
swon:=false;
g:=graphics;
k:=' ';
assign(f,'ERROR');
if pos('.',filenm)<>0 then assign(f,filenm) else
begin
while (g>=0) and (not c) do
begin
if exist(filenm+graphics_codes[g]) then
begin
assign(f,filenm+graphics_codes[g]);
c:=true;
end;
dec(g);
end;
end;
{$I-}
filemode:=66;
reset(f);
filemode:=66;
{$I+}
if ioresult<>0 then
begin
swriteln('File '+filenm+' missing');
ansion:=ansisave;
filemode:=ofm;
exit;
end;
while (not eof(f)) and (not quit) do
begin
if ch=#10 then
begin
chcount:=0;
inc(counter);
end;
read(f,ch);
if chcount>0 then
begin
if swon then
swritec(ch);
end
else
begin
if swon then
begin
if ch<>chflag then
quit:=true;
end
else
if ch=chflag then
swon:=true;
end;
inc(chcount);
end;
close(f);
ansion:=ansisave;
set_foreground(default_fore);
filemode:=ofm;
end;
procedure displayfile;
var
f: text;
g, counter,b: integer;
c,quit,nonstop: boolean;
k,ch: char;
ansisave,moresave: boolean;
ofm: word;
begin
ofm:=filemode;
filemode:=66;
ansisave:=ansion;
ansion:=true;
nonstop:=false;
quit:=false;
counter:=1;
c:=false;
g:=graphics;
k:=' ';
assign(f,'ERROR');
if pos('.',filen)<>0 then assign(f,filen) else
begin
while (g>=0) and (not c) do
begin
if exist(filen+graphics_codes[g]) then
begin
if g in [2,3,5] then
nonstop:=true;
assign(f,filen+graphics_codes[g]);
c:=true;
end;
dec(g);
end;
end;
{$I-}
filemode:=66;
reset(f);
filemode:=66;
{$I+}
if ioresult<>0 then
begin
swriteln('File '+filen+' missing - please inform sysop');
ansion:=ansisave;
filemode:=ofm;
exit;
end;
while (not eof(f)) and (not quit) do
begin
if ch=#10 then inc(counter);
{ if (counter=24) and (not nonstop) then
begin
counter:=1;
swrite('Continue,Stop,Non-stop ? ');
sread_char(ch);
for b:=1 to 26 do
swrite(chr(8));
clreol;
if ch in ['S','s'] then
Quit:=true;
if ch in ['N','n'] then
nonstop:=true;
end; }
{ remove the comments to implement the pause function }
read(f,ch);
if skeypressed then
sread_char(k);
if k=^S then
sread_char(k);
if (k=^k) or (k=^c) then
begin
close(f);
AsyncPurgeOutput;
swriteln('');
ansion:=ansisave;
filemode:=ofm;
exit;
end;
if not quit then
swritec(ch);
end;
close(f);
ansion:=ansisave;
set_foreground(default_fore);
filemode:=ofm;
end;
procedure SendText(s: string);
var
a: integer;
begin;
If (Not AsyncCarrierPresent) then DropMessage;
for a:=1 to length(s) do AsyncSendChar(s[a]);
end;
procedure CharOut(ch: char);
begin;
AsyncSendChar(ch);
end;
function charin(var ch: char): boolean;
begin;
if badchar<>'' then
begin;
ch:=badchar[1];
delete(badchar,1,1);
charin:=true;
end
else
if AsyncCharPresent then
begin;
AsyncReceiveChar(ch);
charin:=true;
end
else charin:=false;
end;
procedure CloseDown;
begin;
if buffered then
AsyncFlushOutput;
If Not noFossinit then
AsyncCloseCom(com_port);
buffered := false;
end;
procedure sclrscr;
begin
if not local then sendtext(#27'[2J');
If NoLocal then
begin
TextColor(statfore);
TextBackGround(statback);
end;
clrscr;
If NoLocal then BlankScreenMessage;
curlinenum:=1;
lastsetfore:=99;
end;
procedure sclreol;
begin;
if not local then sendtext(#27'[K');
clreol;
end;
procedure morecheck;
var
ch: char;
begin;
swrite('<More>');
sread_char(ch);
swrite(#8+#8+#8+#8+#8+#8);
write(' ');
write(#8+#8+#8+#8+#8+#8);
end;
procedure swritec(ch: char);
begin;
if not local then
AsyncSendChar(ch);
if NoLocal then
begin
gotoxy(Wherex+1,Wherey);
exit;
end;
if ansion then
ansi_write(ch)
else
write(ch);
end;
procedure swrite(s: string);
begin;
if hexon then hexfilt(s);
if not local then sendtext(s);
if NoLocal then
begin
GotoXY(wherex+length(s),wherey);
exit;
end;
if ansion then
ansi_write_str(s)
else
write(s);
end;
procedure swriteln(s: string);
begin;
if hexon then hexfilt(s);
if not local then sendtext(s+#13+#10);
if NoLocal then
begin
GotoXY(wherex+length(s),wherey);
writeln;
exit;
end;
if ansion then
begin
s:=s+#13+#10;
ansi_write_str(s);
end
else
writeln(s);
inc(curlinenum);
if (curlinenum=(numlines-1)) then begin;
curlinenum:=1;
if moreok then morecheck;
end;
end;
Procedure swritexy;
begin
Sgoto_XY(x,y);
if hexon then hexfilt(s);
if not local then sendtext(s);
if NoLocal then
begin
GotoXY(wherex+length(s),wherey);
exit;
end;
if ansion then
ansi_write_str(s)
else
write(s);
end;
Procedure Propeller(v:byte);
const
CX :array [1..6] of char =(chr(250),'│','/','-','\','?');
var
b : byte;
begin
b:=6;
case v of
1,15 : b:=1;
2,6,10,14 : b:=2;
3,7,11 : b:=3;
4,8,12 : b:=4;
5,9,13 : b:=5;
end;
if v < 17 then
begin
Swritec(cx[b]);
SwriteC(#8);
end;
end;
procedure DDexit;
begin;
If not local then CloseDown;
if lastmode<>oldtextmode then textmode(oldtextmode);
cursoron;
{ This should fix the problem OS/2 serial IO drivers are having exiting. }
exitproc:=exitsave;
end;
{ Customize this for each game }
Procedure CallProc;
inline($FF/$1E/Proc_Call_Ptr);
Procedure DefineFKeys(var a:char;fkeyon:byte);
begin
a:=#0;
case fkeyon of
1: Display_Fkeys;
2: begin
if inchat>0 then exit;
inchat:=1;
Forced_Chat;
inchat:=0;
a:=#3;
chatdone:=true;
end;
7: inc(time_credit,5);
8: dec(time_credit,5);
10: begin
HosedMessage;
Halt;
end;
end;
end;
procedure sfkeys(var a: char);
var
fkeyon:byte;
begin
fkeyon:=0;
case a of
#59:fkeyon:=1;
#60:fkeyon:=2;
#61:fkeyon:=3;
#62:fkeyon:=4;
#63:fkeyon:=5;
#64:fkeyon:=6;
#65:fkeyon:=7;
#66:fkeyon:=8;
#67:fkeyon:=9;
#68:fkeyon:=10;
else
a:=#0;
end;
If a<>#0 then
DefineFkeys(a,fkeyon);
end;
Procedure ReadScanCode(var a:char);
begin
a :=readkey;
if (a=#0) and (keypressed) then
begin;
a:=readkey;
sFkeys(a);
end;
end;
procedure sread_ch(var ch: char);
var
a: char;
i : integer;
begin;
cc:=0;
a:=#0;
ch:=#0;
charorigin:=localchar;
repeat;
if not local then
begin
If (Not AsyncCarrierPresent) then DropMessage;
if charin(a) then charorigin:=remotechar;
end;
if keypressed then
ReadScanCode(a);
If (a<>#0) then
ch := a
else
If cc mod 100 = 99 then
ReleaseTimeSlice;
inc(cc);
if statline then
begin;
if cc=1 then display_status;
if cc>1000 then cc:=0;
end;
until ch<>#0;
end;
procedure sread_char(var ch: char);
var
ch1,ch2: char;
begin;
curlinenum:=1;
repeat;
if macro<>'' then
begin;
ch:=macro[1];
delete(macro,1,1);
end
else
repeat;
ch:=#0;
if fouled_up<>#0 then
begin;
ch:=fouled_up;
fouled_up:=#0;
end
else
begin;
sread_ch(ch1);
if ch1=^N then
begin;
ch1:=#1;
macro:=macro_str;
end;
{ delay(20);
if (ch1=#27) and skeypressed then
begin;
sread_ch(ch2);
if ch2='[' then
begin;
sread_ch(ch2);
if (ch2 in ['1'..'9']) and (skeypressed) then
sread_ch(ch2);
case ch2 of
'A' : ch:=^E;
'B' : ch:=^X;
'C' : ch:=^D;
'D' : ch:=^S;
end;
end
else
begin;
ch:=ch1;
fouled_up:=ch2;
end;
end
else
}
ch:=ch1;
end;
until ch<>#0;
until ch<>#1;
end;
procedure sread_char_filtered(var ch: char);
begin;
sread_char(ch);
if ch in [#1..#7,#10..#12,#14..#31,#127..#255] then ch:='.';
end;
procedure get_stacked(var s: string);
var
s2: string;
a: integer;
b: boolean;
begin;
s:='';
s2:='';
b:=false;
if length(stacked)=0 then begin;
s:='';
exit;
end;
for a:=1 to length(stacked) do begin;
if stacked[a]=';' then b:=true else if not b then s:=s+stacked[a];
if b then s2:=s2+stacked[a];
end;
if length(s2)>=1 then delete(s2,1,1);
stacked:=s2;
end;
procedure sread(var s: string);
var
ch: char;
hexsave: boolean;
begin;
hexsave:=hexon;
hexon:=false;
curlinenum:=1;
s:='';
get_stacked(s);
if s<>'' then swrite(s) else begin;
repeat;
sread_char_filtered(ch);
if (ch<>#8) and (ch<>^M) then begin;
s:=s+ch;
swrite(ch);
end;
if (ch=chr(8)) and (length(s)>0) then begin;
delete(s,length(s),1);
swrite(chr(8)+' '+chr(8));
end;
until (ch=^M);
if (pos(';',s)<>0) and (stackon) then begin;
stacked:=s;
get_stacked(s);
end;
end;
swriteln('');
hexon:=hexsave;
if hexon then hextodec(s);
end;
procedure sread_num(var n: integer);
var
e: integer;
s: string;
begin;
sread(s);
val(s,n,e);
end;
procedure sread_num_byte(var b: byte);
var
e: integer;
s: string;
begin;
sread(s);
val(s,b,e);
end;
procedure sread_num_word(var n: word);
var
e: integer;
s: string;
begin;
sread(s);
val(s,n,e);
end;
procedure sread_num_longint(var n: longint);
var
e: integer;
s: string;
begin;
sread(s);
val(s,n,e);
end;
{ Speed read is a one time read of the comport. What I have used it for }
{ is part of another routine that reads for a number of seconds. Here }
{ the caller must enter all his commands or info in that time allotment. }
{ They cannot delay a multi-node game by not inputting a command. }
Procedure SpeedRead(var ch : char);
var
a : char;
begin
inc(cc);
if statline then
begin;
if cc=1 then display_status;
if cc>1000 then cc:=0;
end;
ch := #0;
a := #0;
If local then
begin
If KeyPressed then
ReadScanCode(a);
If (a<>#0) then
ch := a
else
If cc mod 100 = 99 then
ReleaseTimeSlice;
exit;
end;
charorigin:=localchar;
If (Not AsyncCarrierPresent) then DropMessage;
if charin(a) then
charorigin:=remotechar
else
If KeyPressed then
ReadScanCode(a);
If (a<>#0) then
ch := a
else
If cc mod 100 = 99 then
ReleaseTimeSlice;
end;
function va(i: integer): string;
var
s: string;
begin;
str(i,s);
va:=s;
end;
procedure set_foreground; { f : byte }
const
colorf: array[0..7] of integer = (30,34,32,36,31,35,33,37);
colorb: array[0..7] of integer = (40,44,42,46,41,45,43,47);
var
s,sb : string;
begin;
if f > 31 then exit;
if (f = current_foreground) then exit;
if Not NoLocal then textcolor(f);
if not local then
begin
if (f=7) and (current_background=0) then
sendtext(#27+'[0m')
else
begin
If current_background = 0 then
sb := ''
else
sb := ';'+va(colorb[current_background]);
case f of
0..7 : begin
s := va(colorf[f]);
case current_foreground of
{ 0..7 : s := s; }
8..31 : s := '0;'+s+sb;
end;
end;
8..15 : begin
s := va(colorf[f-8]);
case current_foreground of
0..7 : s := '1;'+s;
{ 8..15 : s := s; }
16..31 : s := '0;1;'+s+sb;
end;
end;
16..23 : begin
s := va(colorf[f-16]);
case current_foreground of
0..7 : s := '5;'+s;
8..15,
{ 16..23 : s := s; }
24..31 : s := '0;5;'+s+sb;
end;
end;
24..31 : begin
s := va(colorf[f-24]);
case current_foreground of
0..7 : s := '1;5;'+s;
8..15 : s := '5;'+s;
16..23 : s := '1;'+s;
{ 24..31 : s := s; }
end;
end;
end;
sendtext(#27+'['+s+'m');
end;
end;
current_foreground:=f;
end;
procedure set_background; { b : byte }
const
colorb: array[0..7] of integer = (40,44,42,46,41,45,43,47);
begin;
if b > 7 then exit;
if (b = current_background) then exit;
if Not NoLocal then textbackground(b);
current_background:=b;
if not local then
if (current_foreground=7) and (b=0) then
sendtext(#27+'[0m')
else
sendtext(#27+'['+va(colorb[b])+'m');
end;
Procedure Set_Color; { f,b : byte }
const
colorf: array[0..7] of integer = (30,34,32,36,31,35,33,37);
colorb: array[0..7] of integer = (40,44,42,46,41,45,43,47);
var
f1:byte;
s:string;
NoBackG_Ok : boolean;
begin
if (f>31) or (b>7) then exit;
if (f=current_foreground) and (b=current_background) then exit;
if (f<>current_foreground) and (b<>current_background) then
begin
if Not NoLocal then
begin
textcolor(f);
textbackground(b);
end;
If not local then
If (f=7) and (b=0) then
sendtext(#27+'[0m')
else
begin
s := '[';
NoBackG_OK := false;
case f of
0..7 : begin
f1:=f;
case current_foreground of
{ 0..7 : s := s; }
8..31 : begin
s := s+'0;';
NoBackG_OK := true;
end;
end;
end;
8..15 : begin
f1:=f-8;
case current_foreground of
0..7 : s := s+'1;';
{ 8..15 : s := s; }
16..31 : begin
s := s+'0;1;';
NoBackG_OK := true;
end;
end;
end;
16..23 : begin
f1:=f-16;
case current_foreground of
0..7 : s := s+'5;';
8..15,
{ 16..23 : s := s; }
24..31 : begin
s := s+'0;5;';
NoBackG_OK := true;
end;
end;
end;
24..31 : begin
f1:=f-24;
case current_foreground of
0..7 : s := s+'1;5;';
8..15 : s := s+'5;';
16..23 : s := s+'1;';
{ 24..31 : s := s; }
end;
end;
end;
If NoBackG_OK and (b=0) then
sendtext(#27+s+va(colorf[f1])+'m')
else
sendtext(#27+s+va(colorf[f1])+';'+va(colorb[b])+'m');
end;
current_foreground:=f;
current_background:=b;
end
else
if (f<>current_foreground) then
set_foreground(f)
else
set_background(b);
end;
procedure prompt;
const
promptcol1=7;
promptcol2=1;
promptcol3=15;
var
fg,bg: integer;
x,y,code: integer;
ch: char;
a: integer;
hexsave: boolean;
begin;
hexsave:=hexon;
hexon:=false;
fg:=current_foreground;
bg:=current_background;
get_stacked(s);
if s<>'' then begin;
set_foreground(promptcol3);
while length(s)>le do delete(s,length(s),1);
swrite(s);
set_foreground(fg);
end else begin;
if not color_chg then pc:=false;
if pc then begin;
set_foreground(promptcol1);
set_background(promptcol2);
for a:=1 to le do swrite(' ');
for a:=1 to le do swrite(#8);
x:=wherex;
y:=wherey;
end;
s:='';
repeat;
sread_char_filtered(ch); { read(kbd,ch);}
if (ch<>#8) and (ch<>^M) and (length(s)<le) then begin;
s:=s+ch;
swrite(ch); { write(ch);}
end;
if length(s)>200 then delete(s,1,1);
if (ch=chr(8)) and (length(s)>0) then begin;
delete(s,length(s),1);
swrite(chr(8)); { write(#8,' ',#8);}
swrite(' ');
swrite(#8);
end;
until (ch=^M) or (length(s)=999);
if pc then begin;
set_foreground(promptcol3);
set_background(bg);
while wherex>x do swrite(#8);
swrite(s); { write(s);}
while wherex<x+le do swrite(' '); { write(' ');}
set_foreground(fg);
end;
swriteln(''); { writeln('');}
if pos(';',s)<>0 then begin;
stacked:=s;
get_stacked(s);
while length(s)>le do delete(s,length(s),1);
end;
end;
hexon:=hexsave;
end;
procedure sgoto_xy;
var
s,s2: string;
begin;
gotoxy(x,y);
curlinenum := y;
s:=#27+'[';
str(y,s2);
s:=s+s2;
str(x,s2);
s:=s+';'+s2+'f';
if not local then sendtext(s);
end;
function skeypressed: boolean;
var
b: boolean;
begin;
b:=false;
if not local then b:=AsyncCharPresent;
if not b then b:=keypressed;
if macro<>'' then b:=true;
skeypressed:=b;
end;
procedure close_async_port;
begin;
if buffered then begin;
buffered:=false;
AsyncFlushOutput;
AsyncCloseUp;
end;
end;
procedure open_async_port;
begin;
AsyncSelectPort(com_port);
if lockbaud=0 then
AsyncSetBaud(baud_rate)
else
AsyncSetBaud(lockbaud);
buffered := true; { Not set in original DD - this may not be the best }
{ place for this but it does work in my tests }
end;
{
}
var
nclastchar: char;
function NewCrtOutPut(var f: textrec): integer;
var
p: integer;
begin;
for p:=0 to f.bufpos-1 do swrite(f.bufptr^[p]);
f.bufpos:=0;
NewCrtOutPut:=0;
end;
function NewCrtInPut(var f: textrec): integer;
var
p: integer;
ch: char;
begin;
with f do begin;
p:=0;
if nclastchar=#13 then begin; nclastchar:=' '; end else repeat;
ch:=readkey;
nclastchar:=ch;
write(ch);
bufptr^[p]:=ch;
inc(p);
if ch=#13 then write(#10);
if ch=#8 then begin;
write(' '#8);
if p>0 then dec(p);
if p>0 then dec(p);
end;
until (p=bufsize-1) or (ch=#13);
bufpos:=0;
bufend:=p;
end;
NewCrtInput:=0;
end;
function NewCrtIgnore(var f: textrec): integer;
begin;
newcrtignore:=0;
end;
function NewCRTOpen(var f: textrec): integer;
begin;
if f.mode=fmInput then begin;
f.inoutfunc:=@NewCrtInput;
f.flushfunc:=@NewCrtIgnore;
end else begin;
f.mode:=fmOutput;
f.inoutfunc:=@NewCrtOutPut;
f.flushfunc:=@NewCrtOutPut;
end;
NewCrtOpen:=0;
end;
Function RipDetect: boolean;
var
i,j,k : integer;
a : char;
s : string;
RipYes : boolean;
begin
RipYes := false;
If local then
begin
RipDetect := RipYes;
exit;
end;
sendtext(#27+'[0;30m'+#13+#10);
writeln;
writeln('Checking for RIP');
sendtext(#27'[!');
delay(222);
s := '';
i := 0;
j := 0;
charorigin:=localchar;
repeat;
a:=chr(0);
inc(i);
If (Not AsyncCarrierPresent) then DropMessage;
if charin(a) then
charorigin:=remotechar;
if (a<>chr(0)) then
begin
s := s+a;
inc(j);
end
else
begin
If (i mod 50 = 0) then
ReleaseTimeSlice;
end;
delay(2);
until (i>666) or (j>13);
If Copy(s,1,3) = 'RIP' then
begin
RipYes := true;
writeln('Rip Detected');
if charin(a) then
charorigin:=remotechar;
end;
RipDetect := RipYes;
Swriteln('');
end;
procedure DDAssignSOutput(var f: text);
begin;
with textrec(f) do begin;
handle := $FFFF;
mode := fmclosed;
bufsize := sizeof(buffer);
bufptr := @buffer;
OpenFunc := @NewCrtOpen;
CloseFunc:= @NewCrtIgnore;
Name[0] := #0;
end;
end;
Procedure StatusMess(var fs:string);
begin
Set_Color(2,0);
Case Tasker of
1 : writeln('DESQview Detected');
2 : writeln('Windows 3.xx Detected');
3 : writeln('OS/2 Detected');
4 : writeln('Win/NT Detected');
5 : writeln('Dos 5.0 with Network Detected');
6 : writeln('Dos 5.0+ Detected');
else
writeln('No Multiplexer Detected');
end;
If FossilIO or DigiIO then
begin
Set_Foreground(10);
writeln(fs);
end;
Set_Color(7,0);
ReleaseTimeSlice;
end;
procedure InitDoorDriver(ConfigFileName: string);
Var
i,a: byte;
b: integer;
junk: word;
fossilstr:string;
begin;
initddansi;
oldtextmode:=lastmode;
lastsetfore:=99;
setforecheck:=false;
badchar:='';
fossilstr:='';
digiio:=false;
fossilio:=false;
ansion:=false;
moreok:=false;
numlines:=25;
cc:=0;
F1toggle:=0;
Inchat:=0;
clrscr;
window(1,1,80,numlines-1);
node_num:=1;
statfore:=7;
statback:=1;
GoRip := 0;
com_port:=0;
fouled_up:=#0;
stacked:='';
hexon:=false;
buffered:=false;
cdropped:=false;
tdropped:=false;
exitsave:=exitproc;
exitproc:=@DDexit;
firsttime:=true;
LoadPorts(port1,port2,port3,port4,irq1,irq2,irq3,irq4);
Loadconfig( ConfigFileName,
bbs_software,
user_first_name,user_last_name,
user_access_level,
bbs_time_left,
com_port,
baud_rate,
node_num,
local,
graphics,
color1,
color_chg,
noFossinit,
board_name,
pause_code,
sysop_first_name,
sysop_last_name,
maxtime,
localcol,
statfore,
statback,
statline,
EMSOK,NetOK,
nolocal,
fossilio,
digiio,
dropfilepath,
GoRip,
lockbaud,
nodirect,
port1,port2,port3,port4,irq1,irq2,irq3,irq4);
numlines:=25;
if nodirect then directvideo:=false;
clrscr;
window(1,1,80,numlines-1);
textcolor(7);
textbackground(0);
default_fore:=7;
default_back:=0;
gettime(st_hr,st_mn,st_sc,junk);
GetBBSInfo( bbs_software,
user_first_name,user_last_name,
user_access_level,
bbs_time_left,
com_port,
baud_rate,
node_num,
local,
graphics,
color1,
color_chg,
board_name,
sysop_first_name,
sysop_last_name,
maxtime,
dropfilepath,
lockbaud);
ReSetPorts(port1,port2,port3,port4,irq1,irq2,irq3,irq4);
if not local then
begin;
if FossilIO then AsyncSelectFossil(fossilstr) else
if DigiIO then AsyncSelectDigiBoard(fossilstr) else
AsyncSelectInternal;
Open_Async_Port;
end;
if not local then
if not initok then
begin
writeln('');
if fossilio then
begin
writeln('Fossil was not initialized properly! You should change to INTERNAL');
writeln('communications routines.');
end
else
if digiio then
begin
writeln('DigiDriver was not initialized properly!');
end;
delay(3000);
halt;
end;
If GoRip = 4 then { forces RipLink on }
If Local then { If local then forces it into graphics mode as well}
graphics := 5;
If Graphics <> 5 then
If RipDetect then
graphics := 5;
DV_Aware_ON;
current_foreground:=default_fore;
current_background:=default_back;
if graphics = 3 then
begin
set_foreground(statfore);
set_background(statback);
end;
curlinenum:=1;
time_check:=true;
time_credit:=0;
macro_str:='';
macro:='';
mintime:=1;
notime:='';
user_first_name:=stu(user_first_name);
user_last_name:=stu(user_last_name);
stackon:=true;
{ if node_num=0 then node_num:=1; }
ddassignsoutput(soutput);
rewrite(soutput);
If Not NetOk then
If (Tasker = 5) then inc(Tasker);
StatusMess(fossilstr);
end;
end.